/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Comandos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Expressoes.RegraExpressao;
import analiseSintatica.Regras.Regra;

import java.util.LinkedList;

/**
 *
 * @author Ivo Romário
 */
public class RegraPrintf extends Regra {

    protected static Regra instancia;

    protected String estrutura = "printf '(' charconst [',' <expressao>] ')' ';'";

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraPrintf(){

    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraPrintf getInstance() {
        if (instancia == null) {
            instancia = new RegraPrintf();
        }
        return (RegraPrintf) instancia;
    }
    

    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
         

            listaTokens.removeFirst();
            reconheceLexema(listaTokens, "delimitador", "(", estrutura);
            reconheceToken(listaTokens, "charconst", estrutura);

            if(listaTokens.getFirst().getLexema().equals(",")){

                reconheceLexema(listaTokens, "delimitador", ",", estrutura);

                RegraExpressao.getInstance().analisar(listaTokens);
               
             }
            reconheceLexema(listaTokens, "delimitador", ")", estrutura);
            reconheceLexema(listaTokens, "delimitador", ";", estrutura);
         
         return null;

    }

     
    @Override
    protected void setPrimeiro() {
        this.primeiro.add("printf");
    }

   
}
